#ifndef XMLINFOPORTAIL_HPP
#define XMLINFOPORTAIL_HPP

#include "XmlInfoIdentifiant.hpp"

#include <QtCore/QDateTime>

/**
 * Type énuméré décrivant les attaques possibles sur un portail.
 */
enum EnumTypeAttaque
  {
    Aucune    = 0, /**< Pas d'attaque. */
    Sabotage  = 1, /**< Sabotage. */
    Reduction = 2, /**< Réduction de portail. */
    Vol       = 3  /**< Tentative de racket. */
  };

/**
 * Classe représentant un portail. Le portail est défini par son
 * emplacement (ville, pays) le fuseau horaire dans lequel il opère,
 * son niveau et sa défense.
 *
 * @author Johan "Solo" Luisier
 * @date Octobre 2011
 */
class XmlInfoPortail : public XmlInfoIdentifiant
{
public:
  XmlInfoPortail( const QString& nomFichier, const unsigned& id,
		  const QString& ville, const QString& pays,
		  const int& fuseauHoraire, const unsigned& defense,
		  const unsigned& niveau/*, const unsigned& finVerouillage,
		  const unsigned& idAttaque, const EnumTypeAttaque& typeAttaque,
		  const QDateTime limiteIntervention,
		  const QString& agenceAttaquante,
		  const unsigned& idAgenceAttaquante,
		  const QString& syndicatAttaquant,
		  const unsigned& idSyndicatAttaquant,
		  const unsigned& nbrDefensesRestantes*/ );
  XmlInfoPortail( const XmlInfoPortail& portail );
  ~XmlInfoPortail();
  static XmlInfoPortail creeInstance( const QString& nomFichier,
				      const QHash< QString, QString > * infos );
  XmlInfoPortail& operator=( const XmlInfoPortail& portail );
  const QString& ville() const;
  const QString& pays() const;
  const int& fuseauHoraire() const;
  const unsigned& defense() const;
  const unsigned& niveau() const;
  const int& finVerouillage() const;
  const unsigned& idAttaque() const;
  const EnumTypeAttaque& typeAttaque() const;
  const QDateTime& limiteIntervention() const;
  const QString& agenceAttaquante() const;
  const unsigned& idAgenceAttaquante() const;
  const QString& syndicatAttaquant() const;
  const unsigned& idSyndicatAttaquant() const;
  const unsigned& nbrDefensesRestantes() const;

  void setVille( const QString& ville );
  void setPays( const QString& pays );
  void setFuseauHoraire( const int& fuseauHoraire );
  void setDefense( const unsigned& defense );
  void setNiveau( const unsigned& niveau );
  void setFinVerouillage( const int& finVerouillage );
  void setIdAttaque( const unsigned& idAttaque );
  void setTypeAttaque( const EnumTypeAttaque& typeAttaque );
  void setLimiteIntervention( const QDateTime& limiteIntervention );
  void setAgenceAttaquante( const QString& agenceAttaquante );
  void setIdAgenceAttaquante( const unsigned& idAgenceAttaquante );
  void setSyndicatAttaquant( const QString& syndicatAttaquant );
  void setIdSyndicatAttaquant( const unsigned& idSyndicatAttaquant );
  void setNbrDefensesRestantes( const unsigned& nbrDefensesRestantes );
protected:
  XmlInfoPortail();
  XmlInfoPortail( const XmlInfoIdentifiant& id,
		  const QString& ville, const QString& pays,
		  const int& fuseauHoraire, const unsigned& defense,
		  const unsigned& niveau, const int& finVerouillage,
		  const unsigned& idAttaque, const EnumTypeAttaque& typeAttaque,
		  const QDateTime limiteIntervention,
		  const QString& agenceAttaquante,
		  const unsigned& idAgenceAttaquante,
		  const QString& syndicatAttaquant,
		  const unsigned& idSyndicatAttaquant,
		  const unsigned& nbrDefensesRestantes );
  /**
   * Nom de la ville où le portail est installé.
   */
  QString Ville;
  /**
   * Nom du pays dans lequel se trouve le portail.
   */
  QString Pays;
  /**
   * Fuseau horaire de la ville sur laquelle se trouve le portail.
   */
  int FuseauHoraire;
  /**
   * Niveau de défense du portail (entre 0 et 3).
   */
  unsigned Defense;
  /**
   * Niveau du portail, déterminant sa portée (entre 1 et 5).
   */
  unsigned Niveau;
  /**
   * Temps restant jusqu'à la réparation du portail, après une attaque
   * ou une surtension (en secondes).
   */
  int FinVerouillage;
  /**
   * Id de l'attaque subie par le portail (-1 si aucune attaque en
   * cours).
   */
  unsigned IdAttaque;
  /**
   * Type de l'attaque en cours.
   */
  EnumTypeAttaque TypeAttaque;
  /**
   * Date à laquelle l'attaque aura fini, càd le dernier moment pour
   * tenter d'intervenir.
   */
  QDateTime LimiteIntervention;
  /**
   * Nom de l'agence attaquante.
   */
  QString AgenceAttaquante;
  /**
   * Id de l'agence attaquante.
   */
  unsigned IdAgenceAttaquante;
  /**
   * Nom du syndicat attaquant.
   */
  QString SyndicatAttaquant;
  /**
   * Id du syndicat attaquant.
   */
  unsigned IdSyndicatAttaquant;
  /**
   * Nombre de tentatives d'intervention restantes.
   */
  unsigned NbrDefensesRestantes;
};

#endif // XMLINFOPORTAIL_HPP
